#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

class Solution {
public:
    int maxPoints(vector<vector<int>>& points) {
        switch (points.size()) {
            case 0:
                return 0;
            case 1:
                return 1;
            default:
                break;
        }
        int max_points = 2;
        for (int i = 0; i < points.size(); i++) {
            unordered_map<double, int> map;
            int bias = 0;
            for (int j = i + 1; j < points.size(); j++) {
                double k;
                if (points[j][1] == points[i][1] && points[j][0] == points[i][0]) {
                    bias++;
                    continue;
                } else if (points[j][1] == points[i][1]) {
                    k = (double)1 / 0;
                } else {
                    k = (double)(points[j][0] - points[i][0]) / (double)(points[j][1] - points[i][1]);
                }
                unordered_map<double, int>::iterator find_result = map.find(k);
                if (find_result == map.end()) {
                    map[k] = 2;
                } else {
                    find_result->second++;
                }
            }
            max_points = max(max_points, bias + 1);
            for (pair<float, int> iter: map) {
                max_points = max(max_points, iter.second + bias);
            }
        }
        return max_points;
    }
};

int main() {
    Solution solution;
    vector<vector<int>> points = {{0, 0}, {94911151, 94911150}, {94911152, 94911151}};
    int max_points = solution.maxPoints(points);
    cout << max_points << endl;
    float a = 94911151;
    float b = 94911150;
    float c = a / b;
    cout << c << endl;
    return 0;
}